<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      /* 
      ------分数注意事项-----
      本次测试满分为100(最多100分), 有4道加分题; 答案不够完整或者有错误当题0分处理; 

      ------分数处理-----
      (0-60]: 不及格, 处理: 提供第二份不同试卷晚自习的时候重新考试, 并在第二天晚自习时间单独进行测试题提问(大部分都回答不上则采用手抄试卷方案);

      (60-75]: 良良, 处理: 晚自习时间单独进行测试题提问(大部分都回答不上则采用手抄试卷方案);

      (75-90]: 良好, 处理: 放你一马, 好好复习;

      (90-100]: 优秀, 处理: 好好好, 继续保持;
      */

      // 1.JS延迟加载的方式有哪些？（5）
      //懒加载，结合webpack和异步组件的方式实现懒加载
    // 定时器 script 中的 defer 和 async 属性
    // onload js 事件
    // script 标签写在body 后面


      // 2.前端 JavaScript 中的 ECMAScript、DOM、BOM 的含义；（5）
      //Dom 就是对元素实现添加，删除和修改
      //Bom 就是对页面实现更新和对页面进行操作
      //ECMAScript 是一门来定义语法，关键词，对象的语言


      // 4.如何进行数据类型的判断？（5）
      //1.有type of 和 instance of ， Object.prototype.toStirng.call()

      // 5.null 和 undefined 的区别？什么时候会得到 undefined？（5）
      //null 表示是空值， undefined 表示的是未赋值， 
      //什么时候会得到undefined 在 function 返回一个没有被赋值的元素的时候返回一个 undefined

      // 6.如何理解 null == undefined 返回 true，null === undefined 返回 false？（5）

      //null == undefined 返回true 因为两个都表示无的值，使用在数值上是相等的， 
      // null === undefined 返回 false， 因为 他们两个 在 typeof 数据的类型上是不相同的，所以返回false

      // 7.使用 continue 或 break 终止循环时，两种方式的区别是？（5）

      // continue 结束本次循环而不是终止整 个循环
      //break  结束循环,不再进行条件判断

      // 8.如何判断字符串内是否包含指定字符？（5）

      let world="hkkkkgkf"

      if ( world.includes("h")){
        console.log( "has the word")
      }else{
        console.log(" DON'T HAVE")
      }




    

      // 9.请尽量列举出数组的方法，并且注明哪些方法会修改原数组，哪些不会；（5）
     // 1.forEach()  
     //2.map()  
     //3.fliter() 会
     //4.reduce() 
     //5.some()
     //6.every()
     //pop(）会  push 会 shift 会  unshift 会 resverse 会  sort 会  splice 会
     

      // 10. 请写出下面语句的输出结果：（5）
      // let bar = true, number = 0; 
      // console.log(bar + 0);    1
      // console.log(bar + "xyz");   truexyz
      // console.log(bar + true);      2
      // console.log(+true);      1
      // console.log(!'bluej');   false
      // console.log(number++);   0
      // console.log(++number);   2
      // console.log(number);    2

      // 11. 根据用户输入时间实现倒计时，输入时间格式错误时要有错误提示（5）
      // window.prompt("请输入目标时间");
      // let t = new Date(window.prompt("请输入目标时间")).getTime();



      function f1(){

        let t = new Date(prompt ( " 请输入"))
        if ( isNaN(t)){
          alert("")
        }
        else{
          let diff = Math.abs(Date.now()-t.getTime());
        }

        let day = Math.floor(diff / (1000 * 60 * 60 * 24));
        let hour = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
        let minute = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
        let second = Math.floor((diff % (1000 * 60)) / 1000);

        console.log("距离目标时间还有： " + day + "天 " + hour + "小时 " + minute + "分钟 " + second + "秒 ");
        




      }







      // 12.输出从小到大排序好的五个不重复的随机"素数",范围[10-58)；（10）
      // 质数也叫素数是指在大于1的自然数中，除了1和它本身以外不再有其他因数的自然数，不能被任何整数整除的数。


      function f2( min, max, count){
        let arr=[]; 
        for(let i=1; i<= count; i++){
          let flag= true;
          let ran= Math.floor( Math.random()* ( max - min)+ min);
        }   
         for (  let j=2; j < ran; j++){
          if(ran%j ===0){
            flag=false;
            break;
          }

          if(flag && ! arr.includes(ran)){
            arr.push(ran)

          }
          i--;


         }

         return arr.sort();




        




      
      
      }














      // 13.把下面数组成员排序打乱；（5）
      let arr13 = [10, 20, 30, 40, 50, 60];
      let newArr2 = []; // 打乱之后的数组



 
      for(let i =0; i < arr13.length; i++) {
        let j = Math.floor(Math.random() * arr13.length);
       if (!newArr2.includes(arr13[j])) {
        newArr2.push(arr13[j]);
        } else {
           i--;
        }
       }
 
       console.log(newArr2);







     




      // 14. 将多个数组进行去重合并；（10）
      let arr140 = [1, 2, 3],
        arr141 = [2, 3, 4, 5];

        let a=[];


        let unique=[...new Set(arr140)];
        let  underique2=[...new Set(arr141)];

        let j= [...new Set(arr141,arr140)]

        console.log(j)

        let uniqueArray = [];
 
// 遍历第一个数组
for (let i = 0; i < arr140.length; i++) {
  // 检查元素是否已经存在于uniqueArray中
  if (uniqueArray.indexOf(arr140[i]) === -1) {
    // 如果不在，则添加到uniqueArray并标记为已存在
    uniqueArray.push(arr140[i]);
  }
}
 
// 遍历第二个数组
for (let i = 0; i < arr141.length; i++) {
  // 检查元素是否已经存在于uniqueArray中
  if (uniqueArray.indexOf(arr141[i]) === -1) {
    // 如果不在，则添加到uniqueArray并标记为已存在
    uniqueArray.push(arr141[i]);
  }
}
 
console.log(uniqueArray);




        







        

      // 15. 找出数组 arr=[1, 2, 3, "a", 4, "a", 2, 4, "a"] 中重复出现过的元素,并用数组将重复元素装起来输出,并且统计每个元素出现的次数（10）

      let arr15 = [1, 2, 3, 'a', 4, 'a', 2, 4, 'a'];
      let obj = {};
      let count=[];


      function f15(arr){
        array.forEach( function(v){
          if(obj[v]){
            obj[v]++;
          }else{
            obj[v]=1;

          }
        });

        for(let k in obj){
          if(obj[k]>1){
            console.log(`${k}出现${obj[k]}次`);
          }
        }
      }


     
let duplicateElements = [];
let elementCounts = {};
 
for(let i = 0; i < arr.length; i++) {
    if(elementCounts[arr[i]]) {
        elementCounts[arr[i]]++;
        duplicateElements.push(arr[i]);
    } else {
        elementCounts[arr[i]] = 1;
    }
}
 
console.log("重复元素: " + duplicateElements);
console.log("元素出现次数: " + elementCounts);


      
      


 





      


  






      // 16. 找出数组中年龄小于18岁的女生的信息重新组成新的数组,并且将她们count变为现有的平方（10）
      let arr16 = [
        {
          name: '111',
          sex: 'boy',
          age: 18,
          count: 20,
        },
        {
          name: '222',
          sex: 'girl',
          age: 17,
          count: 30,
        },
        {
          name: '333',
          sex: 'boy',
          age: 16,
          count: 40,
        },
        {
          name: '444',
          sex: 'girl',
          age: 15,
          count: 50,
        },
        {
          name: '555',
          sex: 'boy',
          age: 20,
          count: 60,
        },
        {
          name: '666',
          sex: 'girl',
          age: 13,
          count: 70,
        },
        {
          name: '777',
          sex: 'boy',
          age: 14,
          count: 80,
        },
      ];


      let result = arr16.filter(obj => obj.age < 18 && obj.sex === 'girl');
      let ansner= result.map(obj => (obj.count = Math.pow(obj.count, 2))
      
      );


 
     console.log(ansner)


    



      // 17. 实现一个深克隆函数 (加分题 5)


      function deepclone(){


        

      }

      // 18. 实现一个数组的reduce方法 (加分题 5)


       let arr=[1,2,3,4,5,6]
       let sum = arr.reduce( function( total, currentValue){
        return total+currentValue;
       },0)
       console.log(sum)


    

      // 19. 写出强制转换的方法有哪些 (加分题 5)

      //toString, toNumber, parseInt, parseFloat， toBoolean

      var num = 123;
      var str = num.toString()
      

      // 20. 如何判断一个对象是否为空对象的3种方法 (加分题 5)

      if (Object== null){
        console.log( " 空对象")

      }


    


      if (Object.keys(obj).length==0){
        console.log( "空对象")
      }


      //使用for in 来判断 值是否是空对象


  





      





      //
    </script>
  </body>
</html>
